[アップデート] Amazon EMR が AWS KMS のカスタマー管理 CMK を用いた ログファイルの暗号化に対応しました!
コンバンハ、千葉(幸)です。
Amazon EMR が AWS KMS の カスタマー管理 CMK をサポートし、 S3 に出力するログファイル を暗号化できるようになりました!
セキュリティポリシーに柔軟に対応できるようになりましたね!
目次
何が変わったのか
EMR クラスターは EC2 インスタンスで稼働する複数のノードからなります。各ノードで出力されたログはマスターノードに集約され、必要に応じて S3 バケットにアーカイブすることができます。
どういった種類のログが生成されるかは以下をご確認ください。
ここで、S3 に格納されるログファイルを暗号化したい場合、従来は Amazon S3-Managed Keys(SSE-S3)によるサーバサイド暗号化を用いる必要がありました。セキュリティポリシーによってはこれが許容されないケースもあるでしょう。
今回のアップデートにより、AWS KMS の カスタマー管理 CMK を用いた暗号化に対応しました。
注意点として、それぞれ以下で KMS に関するポリシーを設定する必要があります。
- カスタマー管理 CMK(キーポリシー)
- EMR ロール(アタッチされた IAM ポリシー)
- EC2 ロール(アタッチされた IAM ポリシー)
ちなみに
CMK はカスタマーマスターキーの略です。「カスタマー管理のカスタマーマスターキー」と書くと冗長な感じがするので CMK 表記で統一します。
AWS 管理の CMK も存在し、それは例えばキーエイリアスが aws/ebs
となっているようなものを指します。AWS が所有する CMK というものも存在するのですが、それはあまりカスタマーが意識する必要はありません。
詳細は以下を参照してください。
AWS Key Management Service の概念 - AWS Key Management Service
やってみた
以下の 4 ステップで実行していきます。
- 1.EMR および EC2 用ロールの準備
- 2.カスタマー管理 CMK の準備
- 3.EMR クラスターの作成
- 4.ログファイルの確認
レッツ暗号化!
1.EMR および EC2 用ロールの準備
ロールに必要な設定をしていきます。 EMR および クラスター内の EC2 用のロールはデフォルトのものを使用することもできれば、カスタムのものを使用することもできます。
私は過去に EMR クラスターを作成したことがあったので、デフォルトロールが作成されています。今回はこれを使用します。
手動で作成する場合、信頼されたエンティティとしてそれぞれ EMR 、EC2 を設定してください。デフォルトでは以下の AWS 管理ポリシーがアタッチされていました。
- EMR 用:
arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceRole
- EC2 用:
arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforEC2Role
今回はさらに KMS に関する権限を追加していきます。それぞれ以下の権限が必要です。
- EMR 用:
kms:DescribeKey
- EC2 用:
kms:GenerateDataKey
今回はそれぞれ特にリソースとして特定の CMK を指定せず、以下のような形でポリシーを作成し、アタッチしました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:DescribeKey", "Resource": "arn:aws:kms:*:*:key/*" } ] }
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "arn:aws:kms:*:*:key/*" } ] }
2.カスタマー管理 CMK の準備
続いては CMK です。EMR クラスターの作成時に併せてを作成することもできるのですが、今回は先に準備しておきます。
詳細な手順、パラメータ等については以下ドキュメントを参照してください。
キーの作成 - AWS Key Management Service
マネジメントコンソールの KMS の画面から、 [ キーの作成 ] を押下します。
特に変更せず、その代わり力強く [ 次へ ] を押下します。
キーのエイリアスを設定し、 [ 次へ ] を押下します。今回は Test-EMR
という名称のエイリアスを指定しました。
キーの管理者を設定します。必要に応じて設定してください。ここでの設定は EMR によるログ出力の暗号化には影響しません。
今回は特に何も選択せず [ 次へ ] を押下します。
キーの使用者を設定します。ここで先ほどのステップで準備したロールを選択し、[ 次へ ] を押下します。
(後から気づいたのですが、ロール側で必要な権限を持っていれば、ここで追加する必要はありませんでした。逆に、ここでロールを追加するのであれば、ロールに KMS 用のポリシーのアタッチは不要でした。もちろん両方で指定してもよいので、このまま進みます。)
選択した内容に応じてキーポリシーが生成されているため、確認の上、[ 完了 ] を押下します。ここでポリシーを修正することもできます。
これで CMK が準備できました。
3.EMR クラスターの作成
準備が整ったため EMR クラスターを作成していきます。
確認した限りでは、クラスターの作成について詳細な手順はドキュメントには記載が見つかりませんでした。クイックオプションの手順が以下にあるので、あとは各パラメータについて理解を深め、設定してください。(今回は必要最小限の設定で進みます。)
ステップ 2: サンプル Amazon EMR クラスターの起動 - Amazon EMR
EMR の画面から [ クラスターの作成 ] を押下します。
初期状態ではクイックオプションが選択されているのですが、暗号化の設定はここではできません。詳細オプションに切り替えます。
(初見ではそれに気づかずに、あ、意外と EMR って設定項目少ないんだラッキーなどと思ったものです。。)
詳細オプションは全部で 4 ステップあります。順番にステップ 1 から行います。
カスタマー管理 CMK によるログファイルの暗号化は Amazon EMR バージョン 5.30.0 以降 (Amazon EMR 6.0.0 を除く) で対応しているため、適切なバージョンを選択してください。
ソフトウェアは最初から数点選択されていたのですが、ひとまず一つだけ残して次へ進みます。
次のステップではまずクラスター内のノードが立ち上がるサブネットを指定します。
各種ノードの数やスペックを選択できるのですが、今回はマスターノード 1 台のみで構成することにします。コアインスタンスを 0 台にして次へ進みます。
暗号化の設定はこのステップで行うことができます。ログ記録を有効化し、出力先の S3 バケットを指定します。ログ暗号化を有効化し、先ほど作成した CMK を選択します。他の設定はそのままに次に進みます。
次のステップでは IAM ロールに関する設定が含まれます。準備したロールを選択します。繰り返しになりますが、ここで指定するロールには KMS に関するポリシーが設定されている必要があることに留意してください。
いよいよクラスターの作成です。
4.ログファイルの確認
ここまでの手順でマイスイートクラスターが立ち上がりました。パラメータが大量にあって目眩がしますが、出力先の S3 バケットはここから確認できます。(暗号化に使用している CMK はコンソールから確認できませんでした。)
ちなみに、先ほどの画面からフォルダマークのアイコンを押下すると、以下のように S3 バケットの中身のフォルダ構成やファイルの中身を表示することができます。
出力先の S3 バケットを覗きに行ってみます。フォルダ構造を掘っていくと、ファイルにたどり着きました。ひとまず暗号化として AWS-KMS が用いられていることが確認できます。詳細を確認するため、[ プロパティ ] を押下します。
[ 暗号化 ] のタイルの詳細を確認すると、指定した CMK で暗号化されていることが確認できました!
終わりに
EMR により出力されるログファイルを、カスタマー管理 CMK で暗号化できるようになったことを確認しました。セキュリティポリシーによって「暗号化に用いるキーを自身で管理できること」といった要件が存在するケースでは助かりますね。
クラスターノード上で生成されるログはマスターノードに集約されますが、シャットダウンやエラーによってロストする可能性があるため、S3 にアーカイブしておきたいものです。これまで暗号化がネックになって実施していなかったという場合には、改めて採用をご検討ください。
以上、千葉(幸)がお送りしました。